﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using CruzDelSur.Models;
using CruzDelSur.Dominio;
using CruzDelSur.Dominio.Seguridad;
using CruzDelSur.Negocio;
using Microsoft.Reporting.WebForms;
using System.Globalization;

namespace CruzDelSur.Controllers
{
    public class ServiciosController : Controller
    {
        //IoC
        ServiciosService ServiciosService { get; set; }
        //
        // GET: /Servicios/
        // ********************AREA DE SERVICIOS *************************
        [Authorize]
        public ActionResult Index()
        {
            ICollection<Servicio> model = ServiciosService.listarServicios();
            return View(model);
        }

        [Authorize, HttpGet]
        public ActionResult ImprimirServicio(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/ServicioReport.rdlc");
            Servicio servicio = ServiciosService.obtenerServicio(Codigo);
            ReportDataSource reportDataSource = new ReportDataSource("dsCaract", servicio.Caracteristicas);
            localReport.DataSources.Add(reportDataSource);
            reportDataSource = new ReportDataSource("dsTramos", ServiciosService.obtenerServicioTramos(Codigo));
            localReport.DataSources.Add(reportDataSource);

            ReportParameter rp = new ReportParameter("Nombre");
            rp.Values.Add(servicio.Codigo);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Descripcion");
            rp.Values.Add(servicio.Descripcion);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Estado");
            rp.Values.Add(ServiciosModel.Estados(servicio.Estado));
            localReport.SetParameters(rp);

            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        [Authorize, HttpGet]
        public ActionResult ImprimirTramo(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/TramoReport.rdlc");
            Tramo tramo = ServiciosService.obtenerTramo(Codigo);

            ReportParameter rp = new ReportParameter("Codigo");
            rp.Values.Add(tramo.Codigo);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Descripcion");
            rp.Values.Add(tramo.Descripcion);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Origen");
            rp.Values.Add(tramo.Origen);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Destino");
            rp.Values.Add(tramo.Destino);
            localReport.SetParameters(rp);

            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        [Authorize, HttpGet]
        public ActionResult ImprimirUbicacion(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/UbicacionReport.rdlc");
            Ubicacion ubicacion = ServiciosService.obtenerUbicacion(Codigo);

            ReportParameter rp = new ReportParameter("Codigo");
            rp.Values.Add(ubicacion.Codigo);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Descripcion");
            rp.Values.Add(ubicacion.Descripcion);
            localReport.SetParameters(rp);

            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        [Authorize]
        public ActionResult AdicionarFilaTramo()
        {
            return PartialView("Partial/AdicionarFilaTramo", ServiciosService.nuevoFilaTramoModel(null));
        }

        [Authorize]
        public ActionResult CrearServicio()
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            return View("ActualizarServicio", ServiciosService.actualizarServicioModel(null, ServicioEstadoEnum.NUEVO));
        }

        [Authorize]
        [HttpPost]
        public ActionResult CrearServicio(ServiciosModel model)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            model.esModeloValido = ModelState.IsValid;
            try
            {
                model = ServiciosService.procesarServiciosModel(model, Request, new Usuario { Codigo = User.Identity.Name });
                if (model.EstadoEdicion == ServicioEstadoEnum.EDITAR)
                {
                    return RedirectToAction("Index");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarServicio", model);
        }

        [Authorize]
        public ActionResult BajaServicio(string Codigo) {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            return View("BajaServicio", ServiciosService.darBajaServioModel(Codigo, ServicioEstadoEnum.EDITAR));
        }

        [Authorize]
        [HttpPost]
        public ActionResult BajaServicio(string Codigo, ServiciosModel model)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            try
            {
                model.EstadoEdicion = ServicioEstadoEnum.EDITAR;
                if (ServiciosService.darBajaServicio(Codigo, model.Servicio.FechaBaja, new Usuario { Codigo = User.Identity.Name }))
                {
                    return RedirectToAction("Index");
                }
            }
            catch(Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message + model.Servicio.FechaBaja.ToString());
            }
            return View("BajaServicio", model);
        }

        [Authorize]
        public ActionResult ModificarServicio(string Codigo)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            return View("ActualizarServicio", ServiciosService.actualizarServicioModel(Codigo, ServicioEstadoEnum.EDITAR));
        }

        [Authorize]
        [HttpPost]
        public ActionResult ModificarServicio(string Codigo, ServiciosModel model)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            model.EstadoEdicion = ServicioEstadoEnum.EDITAR;
            model.esModeloValido = ModelState.IsValid;
            try
            {
                model = ServiciosService.procesarServiciosModel(model, Request, new Usuario { Codigo = User.Identity.Name });
                if (model.EstadoEdicion == ServicioEstadoEnum.EDITAR)
                {
                    return RedirectToAction("Index");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarServicio", model);
        }

        [Authorize]
        public ActionResult ReportesServicios()
        {
            ReportesServiciosModel model = new ReportesServiciosModel();
            model.setServicios(ServiciosService.listarServicios(), null);
            model.setTramos(ServiciosService.listarTramos(), null);
            return View(model);
        }

        [Authorize]
        [HttpPost]
        public ActionResult ReportesServicios(ReportesServiciosModel model)
        {
            LocalReport localReport = new LocalReport();
            string prefixNameReport = (model.VerGrafico) ? String.Concat(model.TipoReporte, "_graph") :
                                                            model.TipoReporte.ToString();
            localReport.ReportPath = Server.MapPath("~/Reportes/rptServicios"+prefixNameReport+".rdlc");
            ReportDataSource reportDataSource = new ReportDataSource("DataSet1", ServiciosService.ReporteServiciosDAO.reporteServicios(model));
            localReport.DataSources.Add(reportDataSource);
            if (model.VerGrafico) {
              reportDataSource = new ReportDataSource("DataSet2", ServiciosService.ReporteServiciosDAO.reporteServiciosGrafico(model));
              localReport.DataSources.Add(reportDataSource);
            }
            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0in</MarginTop>" +
            "  <MarginLeft>0in</MarginLeft>" +
            "  <MarginRight>0in</MarginRight>" +
            "  <MarginBottom>0in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }


        //Desarrollado por VVM
        ////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////
        ////////////////////////////////////////////
        ////////////////////////////
        //////////////////////////////////////////////////

        [Authorize]
        public ActionResult ListarUbicaciones()
        {

            UbicacionesModel model = new UbicacionesModel();
            model.Ubicaciones = ServiciosService.listarUbicacionesNuevo();
            return View(model);
        }

        [Authorize]
        public ActionResult ListarTramos()
        {
            TramosModel model = new TramosModel();
            model.Tramos = ServiciosService.listarTramosNuevo();
            return View(model);
        }

        [Authorize]
        public ActionResult ModificarUbicacion(string Codigo)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            return View("ActualizarUbicacion", ServiciosService.actualizarUbicacionModel(Codigo, UbicacionEstadoEnum.EDITAR));
        }

        [Authorize]
        public ActionResult ModificarTramo(string Codigo)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            return View("ActualizarTramo", ServiciosService.actualizarTramoModel(Codigo, TramoEstadoEnum.EDITAR));
//            return View();
        }

        [Authorize]
        public ActionResult BajaTramo(string Codigo)
        {
            return View("BajaTramo", ServiciosService.obtenerTramo(Codigo));
        }

        [Authorize, HttpPost]
        public ActionResult BajaTramo(string Codigo, Tramo model)
        {
            try
            {
                model.Codigo = Codigo;
                model.UsuarioModificado = User.Identity.Name;
                if (ServiciosService.darBajaTramo(model))
                {
                    return RedirectToAction("ListarTramos");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("BajaTramo", model);
        }

        [Authorize]
        [HttpPost]
        public ActionResult ModificarUbicacion(string Codigo, UbicacionesModel model)
        {

            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            model.EstadoEdicion = UbicacionEstadoEnum.EDITAR;
            model.esModeloValido = ModelState.IsValid;
            try
            {
                model = ServiciosService.procesarUbicacionesModel(model, Request, new Usuario { Codigo = User.Identity.Name });
                if (model.EstadoEdicion == UbicacionEstadoEnum.EDITAR)
                {
                    return RedirectToAction("ListarUbicaciones");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ListarUbicaciones", model);
            
        }

        [Authorize]
        [HttpPost]
        public ActionResult ModificarTramo(string Codigo, TramosModel model)
        {

            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            model.EstadoEdicion = TramoEstadoEnum.EDITAR;
            model.esModeloValido = ModelState.IsValid;
            try
            {
                model = ServiciosService.procesarTramosModel(model, Request, new Usuario { Codigo = User.Identity.Name });
                if (model.EstadoEdicion == TramoEstadoEnum.EDITAR)
                {
                    return RedirectToAction("ListarTramos");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return RedirectToAction("ListarTramos");
            //return View("ListarTramos", model);

        }

        [Authorize]
        public ActionResult CrearUbicacion()
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            return View("ActualizarUbicacion", ServiciosService.actualizarUbicacionModel(null, UbicacionEstadoEnum.NUEVO));
        }

        [Authorize]
        public ActionResult CrearTramo()
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            return View("ActualizarTramo", ServiciosService.actualizarTramoModel(null, TramoEstadoEnum.NUEVO));
        }

        [Authorize]
        [HttpPost]
        public ActionResult CrearUbicacion(UbicacionesModel model)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            model.esModeloValido = ModelState.IsValid;
            try
            {
                model = ServiciosService.procesarUbicacionesModel(model, Request, new Usuario { Codigo = User.Identity.Name });
                if (model.EstadoEdicion == UbicacionEstadoEnum.EDITAR)
                {
                    return RedirectToAction("ListarUbicaciones");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return RedirectToAction("ListarUbicaciones"); 
            //return View("ListarUbicaciones", model);
        }

        [Authorize]
        [HttpPost]
        public ActionResult CrearTramo(TramosModel model)
        {
            ViewData["FormatDate"] = ServiciosService.formatoFecha();
            model.esModeloValido = ModelState.IsValid;
            try
            {
                model = ServiciosService.procesarTramosModel(model, Request, new Usuario { Codigo = User.Identity.Name });
                if (model.EstadoEdicion == TramoEstadoEnum.EDITAR)
                {
                    return RedirectToAction("ListarTramos");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return RedirectToAction("ListarTramos");
            //return View("ListarUbicaciones", model);
        }

        //APROBACIONES
        [Authorize]
        public ActionResult AprobarServicios()
        {
            int defaultValue = 1;
            return View("AprobarServicios", ServiciosService.aprobarServicioFormModel(defaultValue));
        }

        [Authorize, HttpPost]
        public ActionResult AprobarServicios(AprobarServicioFormModel form)
        {
            if (form.BotonSubmit == form.BotonAprobar)
            {
                ServiciosService.aprobarServicio(form);
            }
            return View("AprobarServicios", ServiciosService.aprobarServicioFormModel(form.TipoServicio));
        }
    }
}
